ssunguotu

  • 主页
  • 随笔
所有文章 关于我

ssunguotu

  • 主页
  • 随笔

[爬虫]request库的使用

2019-09-21

request库的简单使用

Python爬虫之request库的入门

HTTP协议

Hypertext Transfer Protocol,超文本传输协议。

HTTP是一个基于”请求与响应”模式的,无状态的应用层协议。

请求与响应模式:用户发出请求,服务器做出响应。

无状态:第一次请求与第二次请求无相关关联。

应用层协议:该协议工作在TCP协议之上。

URl:

url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。一个url对应一个资源,这个资源可能是各种类型的,如MP3,html等。

以下内容来自百度百科。

格式:

http://host[:port][path]

协议类型://服务器地址[:端口号]/路径/文件名[参数=值]

host:合法的Internet主机域名或Ip地址

我们希望访问的 WWW 页 面就存放在该计算机上。有了这台计算机的名 字,Internet 通过 DNS( 域名服务器) 找到与这台计算机的英文名相对应的数字地址,也叫做 IP 地址,就能够在全世界范围内找到这台计算机,不管它是在哪个国家或哪个地区。
文件所在的服务器的名称或IP地址,后面是到达这个文件的路径和文件本身的名称。服务器的名称或IP地址后面有时还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。

其中提到的DNS:域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

也就是把输入的类似于“www.baidu.com”这样的域名转化为IP地址和对应的端口号。

port:端口号,可省略,缺省端口为80.

所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。
为了对端口进行区分,将每个端口进行了编号,这就是端口号。

比如逻辑端口:浏览网页服务的80端口,用于FTP服务的21端口。

host+port:才可以正常访问服务器。

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。因为IP 地址与网络服务的关系是一对多的关系,不能只靠IP地址来区分不同的服务。实际上是通过“IP地址+端口号”来区分不同的服务的。

path:请求资源的路径。

url的第三项为路径。它定义信息保存在 这台计算机上的什么地方,即哪个子目录中。 每个子目录的前面有 一条斜杠 。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。

文件名:

也就是我们想要访问的某个具体信息的文件名或主页名。http://home.nets cape.com/pub/ma in/index.html 中 index.html 为主页名。

当然,文件名也是可以省略的,如果省略,你所连接的计算机将自动决定使用哪一个文件。常见的 文件类型有:正式的 Web 页( .html) 、纯文本文件( .txt 或.text) 、图片文件( .gif 或.jpeg) 、声音文件( .wav 或.au) 、电 影文件( .avi 或.mpeg) 等。

HTTP协议对资源的操作

mark

mark

HTTP协议通过URL来对资源做定位,然后通过这六个方法对资源进行管理。每次操作都是独立无状态的,也就是这一次操作与下一次操作无关联。

其中,PUT和PATCH的区别是:

PATCH可提交局部修改,是在原有的基础上修改。

而PUT则必须是全局修改,相当于直接做替换。

所以PATCH的好处是节约网络带宽,若只需要修改一部分则用PATCH。

Request库的两个常用对象

mark

1
r = requests.get(url)

右边requests为Request对象,调用get函数返回一个Response对象。

Request

方法

request方法:

Request对象的方法实际都要调用request()方法

mark

request接受的method(方法)参数实际就与其余的几个方法对应。

其中**kwargs,最多可接受13个参数:

param:字典或字节序列,作为参数增加到url中。

通过键值对把一些参数加到url中,使得url再去访问时,不止访问了这个资源,还带入了一些参数,服务器可以接受这些参数,并根据这些参数筛选部分资源返回回来。

mark

data:字典、字节序列或文件对象,作为Request的内容。

作为向服务器提交的内容。

mark

json:JSON格式的数据,同样作为Request的内容

mark

header:字典,HTTP定制协议头。

例如,我们可以把user-agent改为Chorome/10,我们可以模拟任何我们想模拟的浏览器向服务器发出访问,模拟的方法就是在header字段头中实现的。

mark

files:字典类型,传输文件。

向某个链接提供某个文件。

mark

timeout:设定超时时间,秒为单位。

若超过设定时间则抛出异常。

mark

proxies:字典类型,设定访问代理服务器,可以增加登录认证。

例子中即设置代理服务器,访问网站时则使用代理服务器的IP地址。使用这个方法可以有效隐藏用户爬取网页的源IP地址,防止对爬虫的逆追踪。

mark

较高级:

cookie:字典或CookieJay,从HTTP协议中解析cookie

auth:元祖,支持HTTP认证功能。

allow_redirects:True/False,默认为True,重定向开关。

stream:True/False,默认为True,获取内容立即下载开关。

verify:True/False,默认为True,认证SSL证书开关。

cert:本地SSL证书路径。

其余方法

HTTP协议与Request库的方法一一对应。

mark

接受:

get(url,params = None, *kwargs):获得某个url链接对应的资源。这个方法是*最常用**的。

其中params和其余参数与request相同。

head()等都与其大致相同。

因为这些方法中常用到某些参数,所以便将这些参数放到的函数的参数列表中。

示例:

get方法和head方法的对比

1
2
3
4
5
6
>>> r = requests.get("http://www.baidu.com")
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 09 Sep 2019 13:42:08 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:12 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
>>> r.text
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
....以下省略
1
2
3
4
5
>>> r = requests.head("http://www.baidu.com")
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 09 Sep 2019 13:45:33 GMT', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:23 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18'}
>>> r.text
''

所以可以用head方法花费少量的网络资源来获得你需要的概要信息。

提交:

当我们向URLPOST 一个字典,该字典会被默认存储在form表单的字段下。

我们若POST一个字符串,则被自动存在data的字段下。

根据用户提交数据的不同,在服务器上会做相应的整理。

Response

  • Response对象包含爬虫返回的内容和信息

属性

以下为最重要的几个属性(并不全面)

1.status_code

HTTP请求的返回状态,若为200则表示成功,其余均为失败。

2.text

HTTP相应内容的字符串形式,即URL对应的页面内容。

3.encoding

从HTTP header中猜测的相应内容编码方式。(如果网站在HTTP的报头中标注,则为正确的;否则不一定正确。)

其中,如果header中不存在charset,则认为编码为ISO-8859-1.

在HTML中,charset 属性规定在外部脚本文件中使用的字符编码,默认的字符编码是 ISO-8859-1。

4.apparent_encoding

从内容中分析出来的响应内容编码方式。(备选编码方式,一般正确。)

5.content

HTTP响应内容的二进制形式。

通用代码框架

mark

通用代码框架是为了使程序更有效和稳定。

Requests库的异常

mark
mark

内容小结

方法:

mark

事实情况是,因为网络安全的限制,我们很难向一个url发出修改数据的请求。

所以最重要的函数就是get() 和head().

代码框架:

mark

其中,Response对象的成员函数raise_for_status()的作用是,若status不是200,即get失败,则抛出异常。

赏

谢谢你请我吃糖果

扫一扫,分享到微信

微信分享二维码
[爬虫]一个失败的爬虫qaq
[爬虫]爬虫简单实例
  1. 1. Python爬虫之request库的入门
    1. 1.1. HTTP协议
      1. 1.1.1. URl:
        1. 1.1.1.1. HTTP协议对资源的操作
    2. 1.2. Request库的两个常用对象
      1. 1.2.1. Request
        1. 1.2.1.1. 方法
          1. 1.2.1.1.1. request方法:
          2. 1.2.1.1.2. 其余方法
      2. 1.2.2. Response
        1. 1.2.2.1. 属性
          1. 1.2.2.1.1. 1.status_code
          2. 1.2.2.1.2. 2.text
          3. 1.2.2.1.3. 3.encoding
          4. 1.2.2.1.4. 4.apparent_encoding
          5. 1.2.2.1.5. 5.content
    3. 1.3. 通用代码框架
      1. 1.3.1. Requests库的异常
    4. 1.4. 内容小结
© 2021 ssunguotu
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • hexo生成错误
  • 数据结构
  • <数据结构>
  • 爬虫
  • tst
  • 算法题
  • A*搜索

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

没啥东西。